#ifndef _WIFI_H_
#define _WIFI_H_

// 获取文件类型
String getContentType(String filename) {
  if (filename.endsWith(".htm"))
    return "text/html";
  else if (filename.endsWith(".html"))
    return "text/html";
  else if (filename.endsWith(".css"))
    return "text/css";
  else if (filename.endsWith(".js"))
    return "application/javascript";
  else if (filename.endsWith(".png"))
    return "image/png";
  else if (filename.endsWith(".gif"))
    return "image/gif";
  else if (filename.endsWith(".jpg"))
    return "image/jpeg";
  else if (filename.endsWith(".ico"))
    return "image/x-icon";
  else if (filename.endsWith(".xml"))
    return "text/xml";
  else if (filename.endsWith(".pdf"))
    return "application/x-pdf";
  else if (filename.endsWith(".zip"))
    return "application/x-zip";
  else if (filename.endsWith(".gz"))
    return "application/x-gzip";
  return "text/plain";
}

bool handleFileRead(String resource) {  // 处理浏览器HTTP访问
  if (resource.endsWith("/")) {         // 如果访问地址以"/"为结尾
    resource = "/normal.html";          // 则将访问地址修改为/index.html便于SPIFFS访问
  }
  String contentType = getContentType(resource);  // 获取文件类型

  if ((resource == "/normal.html") || (resource == "index.html")) {
    if (admit) {
      if (SPIFFS.exists(resource)) {                   // 如果访问的文件可以在SPIFFS中找到
        File file = SPIFFS.open(resource, "r");        // 则尝试打开该文件
        esp8266_server.streamFile(file, contentType);  // 并且将该文件返回给浏览器
        file.close();                                  // 并且关闭文件
        return true;                                   // 返回true
      }
    } else {
      File file = SPIFFS.open("/disadmit.html", "r");  // 则尝试打开该文件
      esp8266_server.streamFile(file, contentType);    // 并且将该文件返回给浏览器
      file.close();
      return true;
    }
  } else if ((resource != "/normal.html") || (resource != "index.html")) {
    File file = SPIFFS.open(resource, "r");        // 则尝试打开该文件
    esp8266_server.streamFile(file, contentType);  // 并且将该文件返回给浏览器
    file.close();                                  // 并且关闭文件
    return true;
  }

  return false;  // 如果文件未找到，则返回false
}

void handleUserRequest() {

  // 获取用户请求资源(Request Resource）
  String reqResource = esp8266_server.uri();
  Serial.print("reqResource: ");
  Serial.println(reqResource);

  // 通过handleFileRead函数处处理用户请求资源
  bool fileReadOK = handleFileRead(reqResource);

  // 如果在SPIFFS无法找到用户访问的资源，则打开normal.html
  if (!fileReadOK) {
    // esp8266_server.send(404, "text/plain", "404 Not Found");//回复404 (Not Found)
    reqResource = "/normal.html";
    handleFileRead(reqResource);
  }
}

void Handle_ya() {
  li1 = !li1;
  String ret = li1 ? "1" : "0";
  esp8266_server.send(200, "text/plain", ret);
}

void Handle_living() {
  // count_time_living = millis();
  // if (count_time_living - count_time_living_cash >= 3000) {
  // count_time_living_cash = millis();
  li2 = !li2;
  String ret = li2 ? "1" : "0";
  esp8266_server.send(200, "text/plain", ret);
}

void Handle_bed() {
  // count_time_bed = millis();
  // if (count_time_bed - count_time_bed_cash >= 3000) {
  // count_time_bed_cash = millis();
  li3 = !li3;
  String ret = li3 ? "1" : "0";
  esp8266_server.send(200, "text/plain", ret);
}
void Handle_turnoffall() {
  li1 = 0;
  li2 = 0;
  li3 = 0;
  esp8266_server.send(200, "text/plain");
}
void Handle_turnonall() {
  li1 = 1;
  li2 = 1;
  li3 = 1;
  esp8266_server.send(200, "text/plain");
}

String convince_bite(unsigned int num) {
  String ret;  // 0001
  if (num < 1000) {
    ret = "0";
    if (num < 100) {
      ret += "0";
      if (num < 10)
        ret += "0";
    }
    ret += String(num);
  } else
    ret = String(num);
  return ret;
}

void Handle_get_restime() {
  String ret = convince_bite(restime) + convince_bite(autoopentime) + convince_bite(autoclosetime);
  Serial.println(ret);
  esp8266_server.send(200, "text/plain", ret);  // 发送模拟输入引脚到客户端ajax请求
}
void Handle_get_inittime() {
  String ret;
  ret = convince_bite(inittime);
  ret+=String(days_had_ran);
  esp8266_server.send(200, "text/plain", ret);  // 发送模拟输入引脚到客户端ajax请求
}

void Handle_get_butstatue() {
  String ret;
  if (li1)
    ret = "1";
  else
    ret = "0";
  if (li2)
    ret += "1";
  else
    ret += "0";
  if (li3)
    ret += "1";
  else
    ret += "0";
  if (auto_close_open)
    ret += "1";
  else
    ret += "0";
  if (auto_rst)
    ret += "1";
  else
    ret += "0";
  Serial.println(ret);
  esp8266_server.send(200, "text/plain", ret);  // 发送模拟输入引脚到客户端ajax请求
}

void Handle_get_admitstatue() {
  String ret;
  if (admit)
    ret = "true";
  else
    ret = "false";
  esp8266_server.send(200, "text/plain", ret);  // 发送模拟输入引脚到客户端ajax请求
}

void Handle_post_admitchange() {
  String rec = esp8266_server.arg("admit");
  if (rec == "true")
    admit = true;
  else
    admit = false;
  Serial.println(admit);
  esp8266_server.send(200, "text/plain");
}

void Handle_post_inputboxchange() {
  String rec = esp8266_server.arg("auth");
  // auth=rec;

  rec.toCharArray(auth, 13);
  Serial.println(auth);
  // Blinker.begin(auth, ssid, pswd);
  esp8266_server.send(200, "text/plain");
}

void Handle_post_timepickchange() {
  String rec = esp8266_server.arg("restime");
  restime = rec.toInt();
  Serial.println(rec);
  Serial.println(restime);
  esp8266_server.send(200, "text/plain");
}
void Handle_post_autoclose() {
  String rec = esp8266_server.arg("autoclosetime");
  autoclosetime = rec.toInt();
  Serial.println("auto clos");
  Serial.println(autoclosetime);
  esp8266_server.send(200, "text/plain");
}
void Handle_post_autoopen() {
  String rec = esp8266_server.arg("autoopentime");
  autoopentime = rec.toInt();
  Serial.println("auto open");
  Serial.println(autoopentime);
  esp8266_server.send(200, "text/plain");
}

void Handle_post_autorst(){
  auto_rst=!auto_rst;
  esp8266_server.send(200, "text/plain");
}

void Handle_post_autoswitch() {
  auto_close_open = !auto_close_open;
  esp8266_server.send(200, "text/plain");
}

void Handle_post_reset() {
  // 创建文件
  File file = SPIFFS.open(FS_MOUNT_POINT "/data.txt", "w");

  if (!file) {
    Serial.println("无法创建文件！");
    return;
  }
  // 将变量的值写入文件
  file.println(li1 ? "1" : "0");
  file.println(li2 ? "1" : "0");
  file.println(li3 ? "1" : "0");
  file.println(auto_close_open ? "1" : "0");
  file.println(admit ? "1" : "0");
  file.println(wifiConnected ? "1" : "0");

  String intValue1 = String(restime);
  String intValue2 = String(autoopentime);
  String intValue3 = String(autoclosetime);

  file.println(intValue1);
  file.println(intValue2);
  file.println(intValue3);

  // 关闭文件
  file.close();
  ESP.reset();
}
void initWeb() {
  WiFi.begin(ssid, pswd);          // 启动网络连接
  Serial.print("Connecting to ");  // 串口监视器输出网络连接信息
  Serial.print(ssid);
  Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接

  int i = 0;                               // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {  // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
    delay(500);                            // 如果WiFi连接成功则返回值为WL_CONNECTED
    i++;
    ESP.wdtFeed();
    detactswitch();
    Serial.print('.');  // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    if (i >= 10)
      break;
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("");                         // WiFi连接成功后
    Serial.println("Connection established!");  // NodeMCU将通过串口监视器输出"连接成功"信息。
    Serial.print("IP address:    ");            // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
    Serial.println(WiFi.localIP());             // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
    wifiConnected = 1;
  } else {
    Serial.println("");                    // WiFi连接成功后
    Serial.println("Connection falsed!");  // NodeMCU将通过串口监视器输出"连接成功"信息。
    wifiConnected = 0;
  }

  // 初始化网络服务器

  esp8266_server.on("/Yard", Handle_ya);
  esp8266_server.on("/Livingroom", Handle_living);
  esp8266_server.on("/Bedroom", Handle_bed);
  esp8266_server.on("/Turnoffall", Handle_turnoffall);
  esp8266_server.on("/Turnonall", Handle_turnonall);
  esp8266_server.on("/Get-restime", Handle_get_restime);
  esp8266_server.on("/Get-butstatue", Handle_get_butstatue);
  esp8266_server.on("/Get-admitstatue", Handle_get_admitstatue);
  esp8266_server.on("/Get-inittime", Handle_get_inittime);
  esp8266_server.on("/Post-admitchange", Handle_post_admitchange);
  esp8266_server.on("/Post-inputboxchange", Handle_post_inputboxchange);
  esp8266_server.on("/Post-timepickchange", Handle_post_timepickchange);
  esp8266_server.on("/Post-autoopentime", Handle_post_autoopen);
  esp8266_server.on("/Post-autoclosetime", Handle_post_autoclose);
  esp8266_server.on("/Post-autocloseopen", Handle_post_autoswitch);
  esp8266_server.on("/Post-autorst", Handle_post_autorst);
  esp8266_server.on("/Post-reset", Handle_post_reset);

  esp8266_server.onNotFound(handleUserRequest);  // 处理其它网络请求

  // 启动网站服务
  esp8266_server.begin();
  Serial.println("HTTP server started");
}

// 发送HTTP请求并且将服务器响应通过串口输出
// void httpClientRequest(){

//   //重点1 创建 HTTPClient 对象
//   HTTPClient httpClient;

//   //重点2 通过begin函数配置请求地址。此处也可以不使用端口号和PATH而单纯的
//   httpClient.begin(wifiClient,URL);
//   Serial.print("URL: "); Serial.println(URL);

//   //重点3 通过GET函数启动连接并发送HTTP请求
//   int httpCode = httpClient.GET();
//   Serial.print("Send GET request to URL: ");
//   Serial.println(URL);

//   //重点4. 如果服务器响应HTTP_CODE_OK(200)则从服务器获取响应体信息并通过串口输出
//   //如果服务器不响应HTTP_CODE_OK(200)则将服务器响应状态码通过串口输出
//   if (httpCode == HTTP_CODE_OK) {
//     // 使用getString函数获取服务器响应体内容
//     String responsePayload = httpClient.getString();
//     rec=responsePayload.toInt();
//     Serial.println("Server Response Payload: ");
//     Serial.println(responsePayload);
//     Serial.print("rec = ");
//     Serial.println(rec);
//   } else {
//     Serial.println("Server Respose Code：");
//     Serial.println(httpCode);
//   }

//   //重点5. 关闭ESP8266与服务器连接
//   httpClient.end();
// }

#endif
